package main

import (
	"fmt"
	"gitee.com/shu2015626/go_start_imooc/chapter04-oop/tree"
	"golang.org/x/tools/container/intsets"
)

//拓展已有的包功能或者，拓展别人的包
//golang不支持继承，怎么做？
//使用组合，或者别名
type myTreeNode struct {
	//使用组合的方法
	node *tree.Node
}

func (myNode *myTreeNode) postOrder() {
	if myNode == nil || myNode.node == nil {
		return
	}

	left := myTreeNode{myNode.node.Left}
	left.postOrder()
	right := myTreeNode{myNode.node.Right}
	right.postOrder()
	myNode.node.Print()

}

func testSparse(){
	s:=intsets.Sparse{}
	s.Insert(1)
	s.Insert(1000)
	s.Insert(1000000)
	fmt.Println(s.Has(1000))
	fmt.Println(s.Has(10000))
}

func main() {
	var root tree.Node
	//fmt.Println(root)

	root = tree.Node{Value: 3}
	root.Left = &tree.Node{}
	root.Right = &tree.Node{5, nil, nil}
	root.Right.Left = new(tree.Node)
	root.Left.Right = tree.CreateNode(2)

	fmt.Println("树遍历。。。")
	root.Traverse()
	fmt.Println("结束树遍历。。。")

	root.Print()

	//注意，golang都是值传递，因此这里需要将参数改成指针才能有效
	root.Right.Left.SetValue(4)
	root.Right.Left.Print()

	root.SetValue(100)

	pRoot := &root
	pRoot.Print()
	pRoot.SetValue(200)
	pRoot.Print()

	var pnode *tree.Node
	pnode.SetValue(200)
	pnode = &root
	pnode.SetValue(300)
	pnode.Print()

	//拓展功能
	fmt.Println("拓展功能")
	myRoot := myTreeNode{&root}
	myRoot.postOrder()
	fmt.Println()
	fmt.Println("拓展功能")

	testSparse()
}